package com.gengzp.permission.core;

import com.gengzp.permission.exception.PermissionException;
import com.gengzp.permission.model.UserPrincipalModel;
import jakarta.servlet.http.HttpServletRequest;

/**
 * @ClassName PermissionVerificationProcessor
 * @Description 权限验证处理器接口
 * @Author gengzp
 * @Date 2025/8/13 23:51
 */
public interface PermissionVerificationProcessor {

    /**
     * 校验当前请求的uri是否无需权限校验
     *
     * @param requestUri 请求uri
     * @return true:无需权限校验; false:需要权限校验
     */
    Boolean verifyRequestUriIsPermissionExempt(String requestUri);

    /**
     * 校验当前请求的方法是否带有无需权限校验注解 @AuthIgnore
     * <p> 注解全限定路径: </p>
     * {@link com.gengzp.permission.annotation.AuthIgnore}
     *
     * @param handler 请求处理器对象, 封装了请求方法信息
     * @return true:无需权限校验; false:需要权限校验
     */
    Boolean verifyRequestMethodHasAuthIgnoreAnnotation(Object handler);

    /**
     * 校验当前请求的用户认证信息
     * <p> 若权限认证不通过, 该接口会抛出相应的异常信息 </p>
     *
     * @param request 当前请求信息
     * @param handler 请求处理器对象, 封装了请求方法信息
     * @return 当前请求携带的token
     */
    UserPrincipalModel parseAndVerifyRequestAuthentication(HttpServletRequest request, Object handler) throws PermissionException;

}
